﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace magic8ballUtility.Sintaksa
{
    public class UlaznaSintaksa
    {
        HashSet<string> nezavrsniZnakovi;
        HashSet<string> zavrsniZnakovi;
        HashSet<string> sinkronizacijskiZnakovi;
        private string pocetniNezavrsniZnak;
        List<Produkcija> produkcije;


        public HashSet<string> NezavrsniZnakovi
        {
            get { return nezavrsniZnakovi; }
            set { nezavrsniZnakovi = value; }
        }

        public HashSet<string> ZavrsniZnakovi
        {
            get { return zavrsniZnakovi; }
            set { zavrsniZnakovi = value; }
        }

        public HashSet<string> SinkronizacijskiZnakovi
        {
            get { return sinkronizacijskiZnakovi; }
            set { zavrsniZnakovi = value; }
        }

        public string PocetniNezavrsniZnak
        {
            get { return pocetniNezavrsniZnak; }
            set { pocetniNezavrsniZnak = value; }
        }

        public List<Produkcija> Produkcije
        {
            get { return produkcije; }
            set { produkcije = value; }
        }



        public UlaznaSintaksa(string putanja)
        {
            using (StreamReader ulazniTok = File.OpenText(putanja))
            {
                nezavrsniZnakovi = new HashSet<string>();
                zavrsniZnakovi = new HashSet<string>();
                sinkronizacijskiZnakovi = new HashSet<string>();
                pocetniNezavrsniZnak = null;
                produkcije = new List<Produkcija>();
                string trenutniNezavrsniZnak = null;
                string linija = ulazniTok.ReadLine();

                while (linija != null)
                {
                    trenutniNezavrsniZnak = obradiLiniju(linija, trenutniNezavrsniZnak);
                    linija = ulazniTok.ReadLine();

                }
            }
        }

        private string obradiLiniju(string linija, string trenutniNezavrsniZnak)
        {
            bool odredjenPocetniNezavrsni = false;
            if (linija.Substring(0, 1) == "%")
            {
                string pocetak = (linija.Split(' '))[0];
                foreach (var dio in linija.Split(' '))
                {
                    if (dio != pocetak)
                    {
                        switch (pocetak)
                        {
                            case "%V":
                                if (!odredjenPocetniNezavrsni)
                                {
                                    pocetniNezavrsniZnak = dio;
                                    odredjenPocetniNezavrsni = true;
                                }
                                nezavrsniZnakovi.Add(dio);
                                break;
                            case "%T":
                                zavrsniZnakovi.Add(dio);
                                break;
                            case "%Syn":
                                sinkronizacijskiZnakovi.Add(dio);
                                break;
                            default:
                                break;
                        }
                    }
                }
                return null;
            }
            else
            {
                if (linija.StartsWith("<"))
                {
                    trenutniNezavrsniZnak = linija.Substring(0, linija.IndexOf('>') + 1);
                    return trenutniNezavrsniZnak;
                }
                else
                {
                    produkcije.Add(new Produkcija(trenutniNezavrsniZnak, linija.Substring(1)));
                    return trenutniNezavrsniZnak;
                }
            }
        }
    }
}

